home *** CD-ROM | disk | FTP | other *** search
/ PsL Monthly 1993 December / PSL Monthly Shareware CD-ROM (December 1993).iso / prgmming / dos / pascal / crcasm.exe / CRCARC.ASM < prev    next >
Assembly Source File  |  1990-10-30  |  4KB  |  103 lines

  1. IDEAL
  2. ; This CRC-16 routine and tables were converted from pascal code discovered
  3. ; in DEARC.PAS (author unknown).  The result matches the 16 bit CRC computed
  4. ; by SEA's "ARC" utility.  This CRC routine is contributed to the public
  5. ; domain.
  6. ;
  7. ; The Pascal logic is:
  8. ;
  9. ; crc := ((crc shr 8) and $00FF) xor crctab[(crc xor c) and $00FF];
  10. ;
  11. ; This TASM conversion done by:
  12. ;
  13. ;   Edwin T. Floyd [76067h747]
  14. ;   #9 Adams Park Ct.
  15. ;   Columbus, GA 31909
  16. ;   404-576-3305 (work)
  17. ;   404-322-0076 (home)
  18. ;
  19. ; Borland's Turbo Assembler - TASM is required to assemble this program.
  20. ;
  21. SEGMENT  code BYTE PUBLIC
  22.          ASSUME cs:code
  23. ;            0
  24. crctab   dw     00000h, 0C0C1h, 0C181h, 00140h, 0C301h, 003C0h, 00280h, 0C241h
  25.          dw     0C601h, 006C0h, 00780h, 0C741h, 00500h, 0C5C1h, 0C481h, 00440h
  26. ;            1
  27.          dw     0CC01h, 00CC0h, 00D80h, 0CD41h, 00F00h, 0CFC1h, 0CE81h, 00E40h
  28.          dw     00A00h, 0CAC1h, 0CB81h, 00B40h, 0C901h, 009C0h, 00880h, 0C841h
  29. ;            2
  30.          dw     0D801h, 018C0h, 01980h, 0D941h, 01B00h, 0DBC1h, 0DA81h, 01A40h
  31.          dw     01E00h, 0DEC1h, 0DF81h, 01F40h, 0DD01h, 01DC0h, 01C80h, 0DC41h
  32. ;            3
  33.          dw     01400h, 0D4C1h, 0D581h, 01540h, 0D701h, 017C0h, 01680h, 0D641h
  34.          dw     0D201h, 012C0h, 01380h, 0D341h, 01100h, 0D1C1h, 0D081h, 01040h
  35. ;            4
  36.          dw     0F001h, 030C0h, 03180h, 0F141h, 03300h, 0F3C1h, 0F281h, 03240h
  37.          dw     03600h, 0F6C1h, 0F781h, 03740h, 0F501h, 035C0h, 03480h, 0F441h
  38. ;            5
  39.          dw     03C00h, 0FCC1h, 0FD81h, 03D40h, 0FF01h, 03FC0h, 03E80h, 0FE41h
  40.          dw     0FA01h, 03AC0h, 03B80h, 0FB41h, 03900h, 0F9C1h, 0F881h, 03840h
  41. ;            6
  42.          dw     02800h, 0E8C1h, 0E981h, 02940h, 0EB01h, 02BC0h, 02A80h, 0EA41h
  43.          dw     0EE01h, 02EC0h, 02F80h, 0EF41h, 02D00h, 0EDC1h, 0EC81h, 02C40h
  44. ;            7
  45.          dw     0E401h, 024C0h, 02580h, 0E541h, 02700h, 0E7C1h, 0E681h, 02640h
  46.          dw     02200h, 0E2C1h, 0E381h, 02340h, 0E101h, 021C0h, 02080h, 0E041h
  47. ;            8
  48.          dw     0A001h, 060C0h, 06180h, 0A141h, 06300h, 0A3C1h, 0A281h, 06240h
  49.          dw     06600h, 0A6C1h, 0A781h, 06740h, 0A501h, 065C0h, 06480h, 0A441h
  50. ;            9
  51.          dw     06C00h, 0ACC1h, 0AD81h, 06D40h, 0AF01h, 06FC0h, 06E80h, 0AE41h
  52.          dw     0AA01h, 06AC0h, 06B80h, 0AB41h, 06900h, 0A9C1h, 0A881h, 06840h
  53. ;            A
  54.          dw     07800h, 0B8C1h, 0B981h, 07940h, 0BB01h, 07BC0h, 07A80h, 0BA41h
  55.          dw     0BE01h, 07EC0h, 07F80h, 0BF41h, 07D00h, 0BDC1h, 0BC81h, 07C40h
  56. ;            B
  57.          dw     0B401h, 074C0h, 07580h, 0B541h, 07700h, 0B7C1h, 0B681h, 07640h
  58.          dw     07200h, 0B2C1h, 0B381h, 07340h, 0B101h, 071C0h, 07080h, 0B041h
  59. ;            C
  60.          dw     05000h, 090C1h, 09181h, 05140h, 09301h, 053C0h, 05280h, 09241h
  61.          dw     09601h, 056C0h, 05780h, 09741h, 05500h, 095C1h, 09481h, 05440h
  62. ;            D
  63.          dw     09C01h, 05CC0h, 05D80h, 09D41h, 05F00h, 09FC1h, 09E81h, 05E40h
  64.          dw     05A00h, 09AC1h, 09B81h, 05B40h, 09901h, 059C0h, 05880h, 09841h
  65. ;            E
  66.          dw     08801h, 048C0h, 04980h, 08941h, 04B00h, 08BC1h, 08A81h, 04A40h
  67.          dw     04E00h, 08EC1h, 08F81h, 04F40h, 08D01h, 04DC0h, 04C80h, 08C41h
  68. ;            F
  69.          dw     04400h, 084C1h, 08581h, 04540h, 08701h, 047C0h, 04680h, 08641h
  70.          dw     08201h, 042C0h, 04380h, 08341h, 04100h, 081C1h, 08081h, 04040h
  71.  
  72.          MODEL  TPASCAL
  73.  
  74. PUBLIC   UpdateCRCArc
  75. PROC     UpdateCRCArc FAR initcrc:WORD,inbuf:DWORD,inlen:WORD
  76. ; UpdateCRCArc takes an initial CRC value and updates it with inlen bytes from
  77. ; inbuf. The updated CRC is returned in AX.  The Pascal declaration is:
  78. ; Function UpdateCRCArc(InitCRC : Word; Var InBuf; InLen : Word) : Word;
  79. ; Stomps registers: AX,BX,CX,SI
  80.          push   ds
  81.          lds    si,[inbuf]    ; ds:si := ^inbuf
  82.          mov    ax,[initcrc]  ; ax := initcrc
  83.          mov    cx,[inlen]    ; cx := inlen
  84.          or     cx,cx
  85.          jz     @@done
  86. @@loop:
  87.          xor    bh,bh
  88.          mov    bl,al
  89.          lodsb
  90.          xor    bl,al
  91.          shl    bx,1
  92.          mov    bx,[crctab+bx]
  93.          xor    bl,ah
  94.          mov    ax,bx
  95.          loop   @@loop
  96. @@done:
  97.          pop    ds
  98.          ret
  99. ENDP
  100.  
  101. ENDS
  102. END
  103.